home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / pascal / o_gem / source / tictacto / tictacto.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1994-09-22  |  10.7 KB  |  422 lines

  1. PROGRAM TICTAC;
  2.  
  3. {
  4.  
  5. Kleines TicTacToe (bedarf wohl keiner Erklärung) für PurePascal und
  6. ObjectGEM.
  7.  
  8. Darf zusammen mit ObjectGEM unverändert weitergegeben werden.
  9.  
  10.  
  11.                                         Jan Pilgenröder, 1994
  12. }
  13.  
  14. USES
  15.     GEM,OTypes,OWindows;
  16.  
  17. {$I TICTACH.I}
  18.  
  19. TYPE
  20.     TMyApplication =    OBJECT(TApplication)
  21.                             PROCEDURE InitInstance; VIRTUAL;
  22.                             PROCEDURE InitMainWindow; VIRTUAL;
  23.                         END;
  24.                         
  25.     PMyWindow =    ^TMyWindow;                
  26.     TMyWindow =    OBJECT(TWindow)
  27.                     PROCEDURE InitBoard;
  28.                     PROCEDURE ResetBoard;
  29.                     FUNCTION GetStyle : INTEGER; VIRTUAL;
  30.                 END;
  31.     
  32.     PFeldIcon = ^TFeldIcon;
  33.     TFeldIcon = OBJECT(TIcon)
  34.                     status : (empty,cross,circle);
  35.                     Piece : PIcon;
  36.                     PROCEDURE Work; VIRTUAL;
  37.                 END;
  38.                 
  39.     PInfo = ^TInfo;
  40.     TInfo = OBJECT(TToolbar)
  41.                 PROCEDURE Work; VIRTUAL;
  42.             END;
  43.             
  44.     PNew =    ^TNew;
  45.     TNew =     OBJECT(TToolbar)
  46.                 PROCEDURE Work; VIRTUAL;
  47.             END;
  48.                 
  49. VAR
  50.     MyApplication : TMyApplication;
  51.     MyWindow : PMyWindow;
  52.     Arena : ARRAY[0..2,0..2] OF PFeldIcon;
  53.  
  54.  
  55. PROCEDURE do_circles; FORWARD;
  56.  
  57. PROCEDURE TMyApplication.InitInstance;
  58. BEGIN
  59.     LoadResource('TicTacH.Rsc','');
  60.     INHERITED InitInstance;
  61. END;
  62.  
  63. PROCEDURE TMyApplication.InitMainWindow;
  64. VAR
  65.     dumwork : GRECT;
  66. BEGIN
  67.     MyWindow := NEW(PMyWindow,Init(NIL,'TicTacToe'));
  68.     WITH MyWindow^ DO
  69.     BEGIN
  70.         LoadToolbar(panel,FALSE);
  71.         NEW(PInfo,Init(MyWindow,panel,b_info,K_Ctrl,Ctrl_I,NIL,FALSE,FALSE,'Gibt die obligatorische Copyrightmeldung aus.'));
  72.         NEW(PNew,Init(MyWindow,panel,b_new,K_Ctrl,Ctrl_N,NIL,FALSE,FALSE,'Beginnt neues Spiel.'));
  73.         dumwork := work;
  74.         dumwork.g_h := 192;
  75.         dumwork.g_w := 192;
  76.         SetWork(dumwork);
  77.         InitBoard;
  78.     END;
  79. END;
  80.  
  81. FUNCTION TMyWindow.GetStyle : INTEGER;
  82. BEGIN
  83.     GetStyle := NAME OR CLOSER OR MOVER;
  84. END;
  85.  
  86. PROCEDURE I_WIN;
  87. BEGIN
  88.     Application^.Alert(MyWindow,1,STOP,'HaHaHa|ICH habe GEWONNEN!!!','Schluchz');
  89.     MyWindow^.ResetBoard;
  90. END;
  91.  
  92. PROCEDURE I_LOOSE;
  93. BEGIN
  94.     Application^.Alert(MyWindow,1,STOP,'Wehe Mir!!!|Ich habe Versagt!!!','HeHeHe');
  95.     MyWindow^.ResetBoard;
  96.     DO_CIRCLES;
  97. END;
  98.  
  99. PROCEDURE I_TIE;
  100. BEGIN
  101.     Application^.Alert(MyWindow,1,STOP,'Das war ein Unentschieden...','NaJa');
  102.     MyWindow^.ResetBoard;
  103. END;
  104.  
  105. PROCEDURE TMyWindow.InitBoard;
  106. VAR
  107.     X,Y : INTEGER;
  108. BEGIN
  109.     FOR X := 0 TO 2 DO
  110.         FOR Y := 0 TO 2 DO
  111.         BEGIN
  112.             Arena[X,Y] := NEW(PFeldIcon,Init(MyWindow,icons,ic_empty,x*64,y*64,FALSE,TRUE,'','Hier können Sie ein Kreuz machen.'));
  113.             Arena[X,Y]^.status := empty;
  114.         END;
  115. END;
  116.  
  117. PROCEDURE TMyWindow.ResetBoard;
  118. VAR
  119.     X,Y : INTEGER;
  120. BEGIN
  121.     FOR X := 0 TO 2 DO
  122.         FOR Y := 0 TO 2 DO
  123.         BEGIN
  124.             Arena[X,Y]^.status := empty;
  125.             Arena[X,Y]^.uncheck;
  126.             IF Arena[X,Y]^.IsHidden = TRUE THEN
  127.             BEGIN
  128.                 Arena[X,Y]^.Unhide;
  129.                 Arena[X,Y]^.Piece^.Done;
  130.             END;
  131.         END;
  132. END;
  133.  
  134. PROCEDURE Set_Circle(x,y : INTEGER);
  135. BEGIN
  136.     Arena[x,y]^.Status := circle;
  137.     Arena[x,y]^.Hide(False);
  138.     Arena[x,y]^.Piece := NEW(PIcon,Init(MyWindow,icons,ic_o,x*64,y*64,FALSE,FALSE,'','Das hier ist der Kreis des Computer-Gegners.'));
  139. END;
  140.  
  141. PROCEDURE do_circles;
  142. VAR
  143.     FINI,Unentschieden : BOOLEAN;
  144.     X,Y : INTEGER;
  145. BEGIN
  146.     Fini := FALSE;
  147.     {---Lebe ich noch?---}
  148.     FOR X := 0 TO 2 DO
  149.         IF (Fini = FALSE) AND (ARENA[X,0]^.Status = cross) AND (Arena[X,1]^.Status = cross) AND (Arena[X,2]^.Status = cross) THEN
  150.         BEGIN
  151.             Fini := TRUE;
  152.             I_LOOSE;
  153.         END;
  154.     FOR Y := 0 TO 2 DO
  155.         IF (Fini = FALSE) AND (ARENA[0,Y]^.Status = cross) AND (Arena[1,Y]^.Status = cross) AND (Arena[2,Y]^.Status = cross) THEN
  156.         BEGIN
  157.             Fini := TRUE;
  158.             I_LOOSE;
  159.         END;
  160.     IF (Fini = FALSE) AND (ARENA[0,0]^.Status = cross) AND (Arena[1,1]^.Status = cross) AND (Arena[2,2]^.Status = cross) THEN
  161.         BEGIN
  162.             Fini := TRUE;
  163.             I_LOOSE;
  164.         END;
  165.     IF (Fini = FALSE) AND (ARENA[0,2]^.Status = cross) AND (Arena[1,1]^.Status = cross) AND (Arena[2,0]^.Status = cross) THEN
  166.         BEGIN
  167.             Fini := TRUE;
  168.             I_LOOSE;
  169.         END;
  170.     {---Oder ist vieleicht unentschieden---}
  171.     Unentschieden := TRUE;
  172.     FOR X := 0 TO 2 DO
  173.         FOR Y := 0 TO 2 DO
  174.             IF Arena[x,y]^.Status = empty THEN
  175.                 Unentschieden := FALSE;
  176.     IF Unentschieden = TRUE THEN
  177.     I_TIE;
  178.     {---Angriff---}
  179.     {2 Kreise in einer Spalte?}
  180.     FOR X := 0 TO 2 DO
  181.     BEGIN
  182.         IF (Fini = FALSE) AND (ARENA[X,0]^.Status = circle) AND (Arena[X,1]^.Status = circle) AND (Arena[X,2]^.Status = empty) THEN
  183.         BEGIN
  184.             Fini := TRUE;
  185.             set_circle(x,2);
  186.             I_WIN;
  187.         END;
  188.         IF (Fini = FALSE) AND (ARENA[X,0]^.Status = circle) AND (Arena[X,2]^.Status = circle) AND (Arena[X,1]^.Status = empty) THEN
  189.         BEGIN
  190.             Fini := TRUE;
  191.             set_circle(x,1);
  192.             I_WIN;
  193.         END;
  194.         IF (Fini = FALSE) AND (ARENA[X,1]^.Status = circle) AND (Arena[X,2]^.Status = circle) AND (Arena[X,0]^.Status = empty) THEN
  195.         BEGIN
  196.             Fini := TRUE;
  197.             set_circle(x,0);
  198.             I_WIN;
  199.         END;
  200.     END;
  201.     {2 Kreise in einer Zeile?}
  202.     FOR Y := 0 TO 2 DO
  203.     BEGIN
  204.         IF (Fini = FALSE) AND (ARENA[0,Y]^.Status = circle) AND (Arena[1,Y]^.Status = circle) AND (Arena[2,Y]^.Status = empty) THEN
  205.         BEGIN
  206.             Fini := TRUE;
  207.             set_circle(2,Y);
  208.             I_WIN;
  209.         END;
  210.         IF (Fini = FALSE) AND (ARENA[0,Y]^.Status = circle) AND (Arena[2,Y]^.Status = circle) AND (Arena[1,Y]^.Status = empty) THEN
  211.         BEGIN
  212.             Fini := TRUE;
  213.             set_circle(1,Y);
  214.             I_WIN;
  215.         END;
  216.         IF (Fini = FALSE) AND (ARENA[1,Y]^.Status = circle) AND (Arena[2,Y]^.Status = circle) AND (Arena[0,Y]^.Status = empty) THEN
  217.         BEGIN
  218.             Fini := TRUE;
  219.             set_circle(0,Y);
  220.             I_WIN;
  221.         END;
  222.         {2 Kreise von 0,0 nach 2,2?}
  223.         IF (Fini = FALSE) AND (Arena[1,1]^.Status = circle) AND (Arena[2,2]^.Status = circle) AND (Arena[0,0]^.Status = empty) THEN
  224.         BEGIN
  225.             Fini := TRUE;
  226.             set_circle(0,0);
  227.             I_WIN;
  228.         END;
  229.         IF (Fini = FALSE) AND (Arena[1,1]^.Status = circle) AND (Arena[0,0]^.Status = circle) AND (Arena[2,2]^.Status = empty) THEN
  230.         BEGIN
  231.             Fini := TRUE;
  232.             set_circle(2,2);
  233.             I_WIN;
  234.         END;
  235.         IF (Fini = FALSE) AND (Arena[0,0]^.Status = circle) AND (Arena[2,2]^.Status = circle) AND (Arena[1,1]^.Status = empty) THEN
  236.         BEGIN
  237.             Fini := TRUE;
  238.             set_circle(1,1);
  239.             I_WIN;
  240.         END;
  241.         {2 Kreise von 0,2 nach 2,0?}
  242.         IF (Fini = FALSE) AND (Arena[0,2]^.Status = circle) AND (Arena[1,1]^.Status = circle) AND (Arena[2,0]^.Status = empty) THEN
  243.         BEGIN
  244.             Fini := TRUE;
  245.             set_circle(2,0);
  246.             I_WIN;
  247.         END;
  248.         IF (Fini = FALSE) AND (Arena[0,2]^.Status = circle) AND (Arena[2,0]^.Status = circle) AND (Arena[1,1]^.Status = empty) THEN
  249.         BEGIN
  250.             Fini := TRUE;
  251.             set_circle(1,1);
  252.             I_WIN;
  253.         END;
  254.         IF (Fini = FALSE) AND (Arena[1,1]^.Status = circle) AND (Arena[2,0]^.Status = circle) AND (Arena[0,2]^.Status = empty) THEN
  255.         BEGIN
  256.             Fini := TRUE;
  257.             set_circle(0,2);
  258.             I_WIN;
  259.         END;
  260.     END;
  261.     {---Verteidigung---}
  262.     {2 Kreuze in einer Spalte?}
  263.     FOR X := 0 TO 2 DO
  264.     BEGIN
  265.         IF (Fini = FALSE) AND (ARENA[X,0]^.Status = cross) AND (Arena[X,1]^.Status = cross) AND (Arena[X,2]^.Status = empty) THEN
  266.         BEGIN
  267.             Fini := TRUE;
  268.             set_circle(x,2);
  269.         END;
  270.         IF (Fini = FALSE) AND (ARENA[X,0]^.Status = cross) AND (Arena[X,2]^.Status = cross) AND (Arena[X,1]^.Status = empty) THEN
  271.         BEGIN
  272.             Fini := TRUE;
  273.             set_circle(x,1);
  274.         END;
  275.         IF (Fini = FALSE) AND (ARENA[X,1]^.Status = cross) AND (Arena[X,2]^.Status = cross) AND (Arena[X,0]^.Status = empty) THEN
  276.         BEGIN
  277.             Fini := TRUE;
  278.             set_circle(x,0);
  279.         END;
  280.     END;
  281.     {2 Kreuze in einer Zeile?}
  282.     FOR Y := 0 TO 2 DO
  283.     BEGIN
  284.         IF (Fini = FALSE) AND (ARENA[0,Y]^.Status = cross) AND (Arena[1,Y]^.Status = cross) AND (Arena[2,Y]^.Status = empty) THEN
  285.         BEGIN
  286.             Fini := TRUE;
  287.             set_circle(2,Y);
  288.         END;
  289.         IF (Fini = FALSE) AND (ARENA[0,Y]^.Status = cross) AND (Arena[2,Y]^.Status = cross) AND (Arena[1,Y]^.Status = empty) THEN
  290.         BEGIN
  291.             Fini := TRUE;
  292.             set_circle(1,Y);
  293.         END;
  294.         IF (Fini = FALSE) AND (ARENA[1,Y]^.Status = cross) AND (Arena[2,Y]^.Status = cross) AND (Arena[0,Y]^.Status = empty) THEN
  295.         BEGIN
  296.             Fini := TRUE;
  297.             set_circle(0,Y);
  298.         END;
  299.     END;
  300.         {2 Kreuze von 0,0 nach 2,2?}
  301.         IF (Fini = FALSE) AND (Arena[1,1]^.Status = cross) AND (Arena[2,2]^.Status = cross) AND (Arena[0,0]^.Status = empty) THEN
  302.         BEGIN
  303.             Fini := TRUE;
  304.             set_circle(0,0);
  305.         END;
  306.         IF (Fini = FALSE) AND (Arena[1,1]^.Status = cross) AND (Arena[0,0]^.Status = cross) AND (Arena[2,2]^.Status = empty) THEN
  307.         BEGIN
  308.             Fini := TRUE;
  309.             set_circle(2,2);
  310.         END;
  311.         IF (Fini = FALSE) AND (Arena[0,0]^.Status = cross) AND (Arena[2,2]^.Status = cross) AND (Arena[1,1]^.Status = empty) THEN
  312.         BEGIN
  313.             Fini := TRUE;
  314.             set_circle(1,1);
  315.         END;
  316.         {2 Kreuze von 0,2 nach 2,0?}
  317.         IF (Fini = FALSE) AND (Arena[0,2]^.Status = cross) AND (Arena[1,1]^.Status = cross) AND (Arena[2,0]^.Status = empty) THEN
  318.         BEGIN
  319.             Fini := TRUE;
  320.             set_circle(2,0);
  321.         END;
  322.         IF (Fini = FALSE) AND (Arena[0,2]^.Status = cross) AND (Arena[2,0]^.Status = cross) AND (Arena[1,1]^.Status = empty) THEN
  323.         BEGIN
  324.             Fini := TRUE;
  325.             set_circle(1,1);
  326.         END;
  327.         IF (Fini = FALSE) AND (Arena[1,1]^.Status = cross) AND (Arena[2,0]^.Status = cross) AND (Arena[0,2]^.Status = empty) THEN
  328.         BEGIN
  329.             Fini := TRUE;
  330.             set_circle(0,2);
  331.         END;
  332.         {---Noch nichts Konkretes---}
  333.         {Verteidigung gegen:
  334.             x--
  335.             -o-
  336.             --x
  337.         }
  338.         IF (Fini = FALSE) AND (((Arena[0,0]^.Status = cross) AND (Arena[2,2]^.Status = cross))
  339.                             OR ((Arena[0,2]^.status = cross) AND (Arena[2,0]^.Status = cross))) THEN
  340.             IF Arena[0,1]^.Status = empty THEN
  341.             BEGIN
  342.                 Fini := TRUE;
  343.                 set_circle(0,1);
  344.             END
  345.             ELSE
  346.                 IF Arena[1,0]^.Status = empty THEN
  347.                 BEGIN
  348.                     Fini := TRUE;
  349.                     set_circle(1,0);
  350.                 END
  351.                 ELSE
  352.                     IF Arena[2,1]^.Status = empty THEN
  353.                     BEGIN
  354.                         Fini := TRUE;
  355.                         set_circle(2,1);
  356.                     END
  357.                     ELSE
  358.                         IF Arena[1,2]^.Status = empty THEN
  359.                         BEGIN
  360.                             Fini := TRUE;
  361.                             set_circle(1,2);
  362.                         END;
  363.         {--Mitte Besetzen--}
  364.         IF (Fini = FALSE) AND (Arena[1,1]^.Status = empty) THEN
  365.         BEGIN
  366.             Fini := TRUE;
  367.             set_circle(1,1);
  368.         END;
  369.         {--Ecke Besetzen--}
  370.         IF (Fini = FALSE) THEN
  371.             IF (Arena[0,0]^.Status = empty) THEN
  372.             BEGIN
  373.                 Fini := TRUE;
  374.                 set_circle(0,0);
  375.             END
  376.             ELSE
  377.                 IF (Arena[2,2]^.Status = empty) THEN
  378.                 BEGIN
  379.                     Fini := TRUE;
  380.                     set_circle(2,2);
  381.                 END
  382.                 ELSE
  383.                     IF (Arena[2,0]^.Status = empty) THEN
  384.                     BEGIN
  385.                         Fini := TRUE;
  386.                         set_circle(2,0);
  387.                     END
  388.                     ELSE
  389.                         IF (Arena[0,2]^.Status = empty) THEN
  390.                         BEGIN
  391.                             Fini := TRUE;
  392.                             set_circle(0,2);
  393.                         END;
  394.     IF Fini = FALSE THEN I_TIE;
  395. END;
  396.  
  397. PROCEDURE TFeldIcon.Work;
  398. BEGIN
  399.     Hide(False);
  400.     status := cross;
  401.     Piece := NEW(PIcon,Init(MyWindow,icons,ic_x,xpos,ypos,FALSE,FALSE,'','Das hier ist Ihr Kreuz.'));
  402.     do_circles;
  403. END;
  404.  
  405. PROCEDURE TInfo.Work;
  406. BEGIN
  407.     IF ADialog = NIL THEN
  408.         NEW(ADialog,Init(NIL,'Über TicTacToe',info));
  409.     IF ADialog <> NIL THEN
  410.         ADialog^.MakeWindow;
  411. END;
  412.  
  413. PROCEDURE TNew.Work;
  414. BEGIN
  415.     MyWindow^.ResetBoard;
  416. END;
  417.  
  418. BEGIN
  419.     MyApplication.Init('TTT1','TicTacToe');
  420.     MyApplication.Run;
  421.     MyApplication.Done;
  422. END.